/*
 * Copyright (c) OSGi Alliance (2005). All Rights Reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * This copyright applies to the comments and public final static String fields only
 */
package org.osgi.core.framework.events
{
	import flash.events.Event;

	import org.osgi.core.framework.interfaces.IServiceReference;


	/**
	 * An event from the Framework describing a service lifecycle change.
	 * <p>
	 * <code>ServiceEvent</code> objects are delivered to a
	 * <code>ServiceListener</code> objects when a change occurs in this service's
	 * lifecycle. A type code is used to identify the event type for future
	 * extendability.
	 *
	 * <p>
	 * OSGi Alliance reserves the right to extend the set of types.
	 *
	 * @version $Revision: 1.14 $
	 * @see ServiceListener
	 */

	public class ServiceEvent extends Event
	{
		/**
		 * @private
		 */
		private static var serialVersionUID:Number=8792901483909409299;

		/**
		 * Reference to the service that had a change occur in its lifecycle.
		 * @private
		 */
		private var reference:IServiceReference;

		/**
		 * This service has been registered.
		 * <p>
		 * This event is synchronously delivered <strong>after</strong> the service
		 * has been registered with the Framework.
		 *
		 * <p>
		 * The value of <code>REGISTERED</code> is 0x00000001.
		 *
		 * @see BundleContext#registerService(String[],Object,java.util.Dictionary)
		 */
		public static var REGISTERED:int=0x00000001;

		/**
		 * The properties of a registered service have been modified.
		 * <p>
		 * This event is synchronously delivered <strong>after</strong> the service
		 * properties have been modified.
		 *
		 * <p>
		 * The value of <code>MODIFIED</code> is 0x00000002.
		 *
		 * @see ServiceRegistration#setProperties
		 */
		public static var MODIFIED:int=0x00000002;

		/**
		 * This service is in the process of being unregistered.
		 * <p>
		 * This event is synchronously delivered <strong>before</strong> the
		 * service has completed unregistering.
		 *
		 * <p>
		 * If a bundle is using a service that is <code>UNREGISTERING</code>, the
		 * bundle should release its use of the service when it receives this event.
		 * If the bundle does not release its use of the service when it receives
		 * this event, the Framework will automatically release the bundle's use of
		 * the service while completing the service unregistration operation.
		 *
		 * <p>
		 * The value of UNREGISTERING is 0x00000004.
		 *
		 * @see ServiceRegistration#unregister
		 * @see BundleContext#ungetService
		 */
		public static var UNREGISTERING:int=0x00000004;

		/**
		 * Creates a new service event object.
		 *
		 * @param type The event type.
		 * @param reference A <code>ServiceReference</code> object to the service
		 *        that had a lifecycle change.
		 */
		public function ServiceEvent(type:String, reference:IServiceReference)
		{
			super(type);
			this.reference=reference;
		}

		/**
		 * Returns a reference to the service that had a change occur in its
		 * lifecycle.
		 * <p>
		 * This reference is the source of the event.
		 *
		 * @return Reference to the service that had a lifecycle change.
		 */
		public function getServiceReference():IServiceReference
		{
			return reference;
		}

		/**
		 * Returns the type of event. The event type values are:
		 * <ul>
		 * <li>{@link #REGISTERED}
		 * <li>{@link #MODIFIED}
		 * <li>{@link #UNREGISTERING}
		 * </ul>
		 *
		 * @return Type of service lifecycle change.
		 */
		public function getType():String
		{
			return type;
		}

		/**
		 * @inheritDoc
		 */
		override public function clone():Event
		{
			return new ServiceEvent(type, reference);
		}
	}
}